#include <iostream>

using namespace std;
//函数对象
//概念：
//1、重载函数调用操作符的类，其对象常称为函数对象
//2、函数对象使用重载的()时，行为类似函数调用，也叫仿函数

//本质：函数对象(仿函数)是一个类，不是一个函数

//函数对象使用
//特点：
//1、函数对象在使用时，可以像普通函数那样调用, 可以有参数，可以有返回值
//2、函数对象超出普通函数的概念，函数对象可以有自己的状态
//3、函数对象可以作为参数传递

//1、函数对象在使用时，可以像普通函数那样调用, 可以有参数，可以有返回值
class myAdd {
public:
    int operator()(int v1, int v2) {
        return v1 + v2;
    }
};

void test1() {
    myAdd myAdd;
    cout << myAdd(10, 20) << endl;
}

//2、函数对象可以有自己的状态
class myPrint {
public:
    int count = 0;

    myPrint() {
        count = 0;
    }

    void operator()(string str) {
        cout << str << endl;
        ++count;//统计使用次数
    }
};

void test2() {
    myPrint myPrint;
    myPrint("hello");
    myPrint("world");
    myPrint("你好世界");
    cout << "myPrint调用的次数为" << myPrint.count << endl;
}

//3、函数对象可以作为参数传递
void doPrint(myPrint &m, string str) {
    m(str);
}

void test3() {
    myPrint myPrint;
    doPrint(myPrint, "hello C++");
}

int main() {
    test1();
    cout << "=========" << endl;
    test2();
    cout << "=========" << endl;
    test3();
    return 0;
}